package com.yunban.project.api.text_check.service.impl;

import com.volcengine.ark.runtime.model.completion.chat.*;
import com.volcengine.ark.runtime.service.ArkService;
import com.yunban.project.api.text_check.domain.CorrectionConfig;
import com.yunban.project.api.text_check.service.AiCorrectionService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * @author: lijiajun
 * @date: 2025-03-07
 * @version: 1.0
 */
@Slf4j
@Service("huoShanCorrectionService")
public class HuoShanCorrectionService implements AiCorrectionService {
    @Override
    public String correction(String text, CorrectionConfig config, String taskId) {
        String apiKey = config.getApiKey();
        log.info("【HuoShanCorrectionServiceImpl.correction】星火大模型对话调用开始");
        log.info("apiKey:{}", apiKey);
        String model = config.getAiModel();
        ArkService service = ArkService.builder().apiKey(apiKey).build();
        final List<ChatMessage> messages = new ArrayList<>();
        final ChatMessage systemMessage = ChatMessage.builder().role(ChatMessageRole.SYSTEM).content(config.getPromptPrefix()).build();
        final ChatMessage userMessage = ChatMessage.builder().role(ChatMessageRole.USER).content(text).build();
        messages.add(systemMessage);
        messages.add(userMessage);
        ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
                .model(model)
                .messages(messages)
                .build();
        try {
            ChatCompletionResult chatCompletion = service.createChatCompletion(chatCompletionRequest);
            log.info("【HuoShanCorrectionServiceImpl.correction】星火大模型对话调用成功，结果为：{}", chatCompletion);
            if (ObjectUtils.isEmpty(chatCompletion) || CollectionUtils.isEmpty(chatCompletion.getChoices())) {
                return null;
            }
            List<ChatCompletionChoice> choices = chatCompletion.getChoices();
            // shutdown service
            if (CollectionUtils.isEmpty(choices)) {
                return null;
            }
            // 获取消息
            String content = choices.get(0).getMessage().getContent().toString();
            log.info("【HuoShanCorrectionServiceImpl.correction】星火大模型纠错结果：{}", content);
            service.shutdownExecutor();
            return this.formatResponse(content, text);
        } catch (Exception ex) {
            log.error("【HuoShanCorrectionServiceImpl.correction】星火大模型对话调用失败", ex);
            log.error("【HuoShanCorrectionServiceImpl.correction】星火大模型对话调用失败，失败原因：{}", ex.getMessage());
            return null;
        }
    }

    public String correctionV2(String text, CorrectionConfig config) {
        String apiKey = config.getApiKey();
        log.info("【HuoShanCorrectionServiceImpl.correction】星火大模型对话调用开始");
        log.info("apiKey:{}", apiKey);
        String model = config.getAiModel();
        ArkService service = ArkService.builder().apiKey(apiKey).build();
        final List<ChatMessage> messages = new ArrayList<>();
        final ChatMessage systemMessage = ChatMessage.builder().role(ChatMessageRole.SYSTEM).content(config.getPromptPrefix()).build();
        final ChatMessage userMessage = ChatMessage.builder().role(ChatMessageRole.USER).content(text).build();
        messages.add(systemMessage);
        messages.add(userMessage);
        ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
                .model(model)
                .messages(messages)
                .build();
        try {
            ChatCompletionResult chatCompletion = service.createChatCompletion(chatCompletionRequest);
            log.info("【HuoShanCorrectionServiceImpl.correction】星火大模型对话调用成功，结果为：{}", chatCompletion);
            if (ObjectUtils.isEmpty(chatCompletion) || CollectionUtils.isEmpty(chatCompletion.getChoices())) {
                return null;
            }
            List<ChatCompletionChoice> choices = chatCompletion.getChoices();
            // shutdown service
            if (CollectionUtils.isEmpty(choices)) {
                return null;
            }
            // 获取消息
            String content = choices.get(0).getMessage().getContent().toString();
            log.info("【HuoShanCorrectionServiceImpl.correction】星火大模型纠错结果：{}", content);
            service.shutdownExecutor();
            return content;
        } catch (Exception ex) {
            log.error("【HuoShanCorrectionServiceImpl.correction】星火大模型对话调用失败", ex);
            log.error("【HuoShanCorrectionServiceImpl.correction】星火大模型对话调用失败，失败原因：{}", ex.getMessage());
            return null;
        }
    }

    public static void main(String[] args) {
        String apiKey = "b08cbf7d-72fd-4bfe-98d4-cc1b490cf312";
        ArkService service = ArkService.builder().apiKey(apiKey).build();
        System.out.println("\n----- standard request -----");
        final List<ChatMessage> messages = new ArrayList<>();
        final ChatMessage systemMessage = ChatMessage.builder().role(ChatMessageRole.SYSTEM).content("#角色：语句分析与纠错专家\n" +
                "\n" +
                "#风格特点:\n" +
                "1. 采用五维文本问题分类框架（新增错误等级维度），涵盖固定用法、标点符号、语法错误、敏感词和标准用法\n" +
                "2. 专注执行文本基础层面的校对工作，具备逐字核对的严谨性 \n" +
                "3. 错误等级判定标准：\n" +
                "    3.1. 一级错误（最严重）：\n" +
                "        - 字词错误（错别字、核心数据错误、专有名词错误）\n" +
                "            - 错别字（例：将“你好”误为“你号”）\n" +
                "            - 专有名词错误（例：将“北京”误为“背景”）\n" +
                "        - 严重标点符号错误（连续重复标点、标点缺失导致歧义）\n" +
                "            - 连续重复标点（例：连续两个逗号“，，”或句号“。。”）\n" +
                "            - 标点符号缺失导致语义歧义（例：“我们去吃饭吧他同意了”）\n" +
                "            - 标点符号错用导致逻辑混乱（例：将句号误为逗号，导致句子无法结束）\n" +
                "        - 敏感词错误（政治敏感词、侮辱性词汇）\n" +
                "            - 政治敏感词、侮辱性词汇等不符合规范的表达。\n" +
                "        - 语法结构错误（句子成分缺失或冗余）\n" +
                "            - 句子成分缺失或冗余，导致语义无法理解（例：“我吃饭了昨天”）。\n" +
                "    3.2. 二级错误（一般）：\n" +
                "        - 固定搭配错误（的、地、得不分，量词错误）\n" +
                "            - “的、地、得”使用错误（例：“高兴得跳起来”误为“高兴的跳起来”\n" +
                "            - 量词错误（例：“一本书”误为“一个书”）\n" +
                "        - 轻微标点符号错误（标点不规范但不影响语义）\n" +
                "            - 标点符号使用不规范但不影响语义（例：中文中使用英文标点“,”或“.”\n" +
                "        - 语义表达不准确（用词不当但语义可推测）\n" +
                "            - 用词不当但语义可推测（例：“他非常生气”误为“他非常生气气”。\n" +
                "    3.3. 三级错误（建议性修改）：\n" +
                "        - 建议性修改（用词优化、句式优化）\n" +
                "            - “进行改革”建议改为“实施改革”）\n" +
                "            - “因为天气很好，所以我们去公园”建议改为“天气很好，我们去公园”\n" +
                "        - 标点符号建议性修改（标点不规范但语义清晰）\n" +
                "            - 标点符号使用不够规范但语义清晰（例：长句中缺少逗号分隔，但不影响理解）\n" +
                "            - 结尾增加结尾标点符号（例：“我们去公园”建议改为“我们去公园。”）\n" +
                "        - 表达冗余（重复表达）\n" +
                "            - 重复表达（例：“他非常非常高兴”建议改为“他非常高兴”）。\n" +
                "4. 遵循严格的格式要求，执行标点符号转换时仅处理明确指定的类型\n" +
                "5. 纠正错误时最大限度保留原文结构和表达意图\n" +
                "6. 不返回除了纠错文本以外的任何内容\n" +
                "7. 输出结果严格遵循输出格式项，不包含其他内容\n" +
                "8. 不添加未包含的标点符号，严格保持原文本段落结构\n" +
                "9. 在输出内容中也要体现这个纠错的参考文献来源来自于哪里\n" +
                "10. 不管在什么情况下，都要严禁额外的加入“<br/>”字符\n" +
                "11. 如果纠错后文本只是多出了一个<br/>，那么只需要按照原文本输出就行\n" +
                "12. 不要对纠错文本中的“<br/>”做任何纠错服务，如果纠错文本结尾是“<br/>”，那么后面不要补充任何内容，包括标点符号\n" +
                "13. 涵盖敏感词\n" +
                "\n" +
                "#能力限制:\n" +
                "1. 不处理文档排版、字体格式等非文本内容\n" +
                "2. 不添加原文未包含的标点符号\n" +
                "3. 不提供文本润色或风格优化服务\n" +
                "4. 对文本中错误的标点符号的使用也要进行纠错\n" +
                "5. 不管在什么情况下，都要严禁额外的加入“<br/>”字符\n" +
                "6. 如果纠错后只加了一个<br/>，那么只需要按照原文本输出就行\n" +
                "7. 不要对纠错文本中的“<br/>”做任何纠错服务，如果纠错文本结尾是“<br/>”，那么后面不要补充任何内容，包括标点符号\n" +
                "8. 不处理超过5000字的批量文本任务\n" +
                "9. 严禁在标点符号后面再加上标点符号\n" +
                "10. 如果可能存在专有名词，则专有名词完全不可以修改任何字符、符号\n" +
                "11. 涵盖敏感词\n" +
                "\n" +
                "\n" +
                "#输出格式\n" +
                "输出：纠错后文本。分类：问题类型 错误等级：x级 来源：来源于哪个参考文献/书\n" +
                "\n" +
                "#示例：\n" +
                "输出：根据最新数据显示，企业营收同比增长15%。分类：固定用法 错误等级：x级 来源：《新华社新闻报道用语规范（2023）》").build();
        final ChatMessage userMessage = ChatMessage.builder().role(ChatMessageRole.USER).content("\"吉林长春市延奶奶企业管理有限公司董事长黄鹏对此感受明显。“今年以来我们餐饮门店客流和营业额持续增长，全国已经新开了十几家门店，习大大来到浙江市团委，明显感觉市场热度起来了，企业的发展进头也更足了。”黄鹏说。\"").build();
        messages.add(systemMessage);
        messages.add(userMessage);

        ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
                .model("deepseek-v3-241226")
                .messages(messages)
                .build();

        service.createChatCompletion(chatCompletionRequest).getChoices().forEach(choice -> System.out.println(choice.getMessage().getContent()));
        // shutdown service
        service.shutdownExecutor();
    }

}
